/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package operacjeuzytkownikow;
import java.util.regex.Pattern;
import java.util.regex.Matcher;
import java.util.*;

/**
 *
 * @author gacek
 */

public class UsersManager {
    public static int DBMODE = UserDAOFactory.TEST;

   // private Set<User> userBase=new HashSet<User>();

    boolean CheckREGON(String str)
    {
	if (str.length() != 9){
		return false;
	}

	int[] arrSteps = {8, 9, 2, 3, 4, 5, 6, 7};

	int intSum=0;
	for (int i = 0; i < 8; i++)
	{
		intSum += arrSteps[i] * Integer.valueOf(str.charAt(i));
	}
	int intr = intSum % 11;
	int intControlNr=(intr == 10)?0:intr;
	if (intControlNr == Integer.valueOf(str.charAt(8)))
	{
		return true;
	}
	return false;
    }

    boolean walidacja(User u){

        if(!walidacjaUserPass(u))return false;

        //walidacja nazwy firmy/ imienia i nazwiska
        Pattern r = Pattern.compile("[^A-ZŁĄŻŹĘÓĆŚŃa-złążźęóćśń0-9\\- ]");
        Matcher m = r.matcher(u.getName());
        if(m.find()){
            System.err.print("Nieprawidłowa nazwa firmy / nieprawidłowe imię i nazwisko!\n" +
                    "Hasło może zawierać jedynie:\n" +
                    "wielkie litery od A do Z\n" +
                    "małe litery od a do z\n" +
                    "znaki niealfabetyczne: -, (spacja)\n");
            return false;
        }

        //walidacja ulicy
        r = Pattern.compile("[^A-ZŁĄŻŹĘÓĆŚŃa-złążźęóćśń\\-]");
        m = r.matcher(u.getStreet());
        if(m.find() && !u.getStreet().equals("") ){
            System.err.print("Nieprawidłowa nazwa ulicy!\n" +
                    "Hasło może zawierać jedynie:\n" +
                    "wielkie litery od A do Z\n" +
                    "małe litery od a do z\n" +
                    "znak niealfabetyczny: -\n");
            return false;
        }

        //walidacja numeru domu
        r = Pattern.compile("^([0-9])+[A-Za-z]$");
        m = r.matcher(u.getHouseNr());
        if(!m.find() && !u.getHouseNr().equals("")){
            System.err.print("Nieprawidłowy numer domu! (prawidłowy: ([0-9])+[A-Za-z])");
            return false;
        }

        //walidacja kodu pocztowego
        r = Pattern.compile("^([0-9]){5}$");
        m = r.matcher(u.getPostCode());
        if(!m.find() && !u.getPostCode().equals("")){
            System.err.print("Nieprawidłowy numer pocztowy! (prawidłowy: pięć znaków [0-9])");
            return false;
        }

        //walidacja nazwy miasta
        r = Pattern.compile("^[^A-ZŁĄŻŹĘÓĆŚŃa-złążźęóćśń\\- ]$");
        m = r.matcher(u.getCity());
        if(!m.find() && !u.getCity().equals("")){
            System.err.print("Nieprawidłowa nazwa miasta! (dopuszczalne tylko znaki literowe, myślnik oraz (spacja))");
            return false;
        }

        //walidacja e-mail
        r = Pattern.compile("^[_a-zA-Z0-9-]+(\\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(\\.[a-zA-Z0-9-]{1,})*\\.([a-zA-Z]{2,}){1}$");
        m = r.matcher(u.getMail());
        if(!m.find()){
            System.err.print("Nieprawidłowy e-mail!");
            return false;
        }

        //walidacja nr telefonu
        r = Pattern.compile("^([0-9]){9,11}$");
        m = r.matcher(u.getPhone());
        if(!m.find() && !u.getPhone().equals("")){
            System.err.print("Nieprawidłowy numer telefonu!");
            return false;
        }

        //walidacja NIP
        if(!Pattern.matches("^[0-9]{10}$", u.getNIP()) && !u.getNIP().equals("")){
            System.err.print("Nieprawidłowy numer NIP!");
            return false;
        }

        //walidacja REGON
        if(!Pattern.matches("^[0-9]{9}$", u.getRegon()) || !CheckREGON(u.getRegon())){
            if(!u.getRegon().equals("")){
                System.err.print("Nieprawidłowy numer REGON!");
                return false;
            }
        }

        return true;
    }
    boolean walidacjaUserPass(User u){
        //walidacjaUserPass loginu
        Pattern r = Pattern.compile("[^A-ZŁĄŻŹĘÓĆŚŃa-złążźęóćśń0-9\\-_@ ]");
        Matcher m = r.matcher(u.getLogin());
        if(m.find()){
            System.err.print("Nieprawidłowa nazwa użytkownika!\n" +
                    "Hasło może zawierać jedynie:\n" +
                    "wielkie litery od A do Z\n" +
                    "małe litery od a do z\n" +
                    "10 cyfr podstawowych (od 0 do 9)\n" +
                    "znaki niealfabetyczne: -_ (spacja)@\n");
            return false;
        }

        //walidacjaUserPass hasła
        Pattern piloscznakow =
        Pattern.compile(".{6,}");

        Matcher miloscznakow =
        piloscznakow.matcher(u.getPassword());

        Pattern plogin =
        Pattern.compile(u.getLogin());

        Matcher mlogin =
        plogin.matcher(u.getPassword());

        Pattern pspecjalne =
        Pattern.compile("[!$#%]");

        Matcher mspecjalne =
        pspecjalne.matcher(u.getPassword());

        if(!(miloscznakow.find() && (!mlogin.find()) && mspecjalne.find())){
            System.err.print("Błędne hasło! Format hasła:\n" +
                    "conajmniej 6 znaków\n" +
                    "brak występowania loginu w haśle\n" +
                    "wielkie litery od A do Z\n" +
                    "małe litery od a do z\n" +
                    "10 cyfr podstawowych (od 0 do 9)\n" +
                    "obowiązkowe znaki niealfabetyczne (na przykład: !, $, #, %)\n");
            return false;
        }
        return true;
    }
    public boolean rejestruj(HashMap dane)
    {
        User pattern = new User();
        pattern.setLogin((String)dane.get(0));

        //if(!walidacja(pattern))return false;

        UserDAOFactory udf = UserDAOFactory.getUserDAOFactory(DBMODE);
        UserDAO ud = udf.getUserDAO();
        
        return ud.insertUser(pattern) == 0;
    }
    public User zaloguj(String login, String pass)
    {
        User logowany = new User();
        User znaleziony = new User();
        logowany.setLogin(login);
        logowany.setPassword(pass);

        //if(!walidacjaUserPass(logowany))return null;
        
        UserDAOFactory udf = UserDAOFactory.getUserDAOFactory(DBMODE);
        UserDAO ud = udf.getUserDAO();
        znaleziony = ud.findUser(login);

        if(znaleziony.getPassword().equals(logowany.getPassword())){
            return znaleziony;
        }
        else{
            return null;
        }
    }

    public boolean wyloguj(String login)
    {
        UserDAOFactory udf = UserDAOFactory.getUserDAOFactory(DBMODE);
        UserDAO ud = udf.getUserDAO();
        User wylogowany = ud.findUser(login);

        //if(!walidacjaUserPass(wylogowany))return false;

        //userBase.remove(wylogowany);
        return true;
    }

    public boolean usunUzytkownika(String login, String pass)
    {
        UserDAOFactory udf = UserDAOFactory.getUserDAOFactory(DBMODE);
        UserDAO ud = udf.getUserDAO();
        User usuwany = ud.findUser(login);

        if(usuwany.getPassword().equals(pass)){
            return ud.deleteUser(usuwany);
        }
        else
        return false;
    }

}
